๋ธ๋ผ์ฐ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ดํฐ ์์์ฑ์ ํ์ฉํ์ธ์. ์ด ๊ฐ์ด๋๋ ์ฟ ํค, ์น ์คํ ๋ฆฌ์ง, IndexedDB, Cache API๋ฅผ ํ์ํ๋ฉฐ ๊ธ๋ก๋ฒ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ์ ๋ต์ ์ ๊ณตํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง ๊ด๋ฆฌ: ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ดํฐ ์์์ฑ ์ ๋ต
์ค๋๋ ๊ณผ ๊ฐ์ด ์ํธ ์ฐ๊ฒฐ๋ ์ธ์์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ด์ ์ ์ ์ธ ํ์ด์ง๊ฐ ์๋๋๋ค. ์ฌ์ฉ์์ ์ ํธ๋๋ฅผ ๊ธฐ์ตํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๊ฑฐ๋, ์ฌ์ง์ด ์คํ๋ผ์ธ์ผ๋ก ์๋ํด์ผ ํ๋ ๋์ ์ด๊ณ ์ํธ์์ฉ์ ์ธ ๊ฒฝํ์ ๋๋ค. ์น์ ๋ณดํธ์ ์ธ ์ธ์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ๋ฐ์ดํฐ ์์์ฑ์ ๊ด๋ฆฌํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ ๋ชจ์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ ๊ฒ์ ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ๋์์ผ๋ก ํ๋ ๊ณ ์ฑ๋ฅ์ ํ๋ ฅ์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ค๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ๊ธฐ๋ณธ์ ๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ ํด๋ผ์ด์ธํธ ์ธก ๋ฐ์ดํฐ ์์์ฑ์ ์ํ ๋ค์ํ ์ ๋ต์ ๊น์ด ํ๊ณ ๋ค์ด ๊ฐ๊ฐ์ ๊ฐ์ , ์ฝ์ , ์ด์์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฟ ํค, ์น ์คํ ๋ฆฌ์ง(localStorage ๋ฐ sessionStorage), IndexedDB, Cache API์ ๋ณต์ก์ฑ์ ํ์ํ์ฌ ๋ค์ ์น ํ๋ก์ ํธ์ ๋ํด ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋ ์ง์์ ์ ๊ณตํ๊ณ , ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ต์ ์ ์ฑ๋ฅ๊ณผ ์ํํ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง์ ์งํ: ์ข ํฉ์ ์ธ ๊ฐ์
ํ๋ ๋ธ๋ผ์ฐ์ ๋ ํด๋ผ์ด์ธํธ ์ธก์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์ฌ๋ฌ ๊ฐ์ง ๋ ํนํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ๊ฐ์ ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๋ฉฐ ๊ณ ์ ํ ๊ธฐ๋ฅ๊ณผ ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์ ์ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ๋ ๊ฒ์ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ฟ ํค: ์ ์ ๊น์ง๋ง ์ ํ์ ์ธ ์ต์
์ฟ ํค๋ ๊ฐ์ฅ ์ค๋๋๊ณ ๊ฐ์ฅ ๋๋ฆฌ ์ง์๋๋ ํด๋ผ์ด์ธํธ ์ธก ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ๋๋ค. 1990๋ ๋ ์ค๋ฐ์ ๋์ ๋ ์ฟ ํค๋ ์๋ฒ๊ฐ ์ฌ์ฉ์์ ์น ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด๋ ์์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ผ๋ก, ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ์ ์ฅํ๋ค๊ฐ ๋์ผํ ์๋ฒ์ ๋ํ ๋ชจ๋ ํ์ ์์ฒญ๊ณผ ํจ๊ป ๋ค์ ๋ณด๋ ๋๋ค. ์ด๊ธฐ ์น ๊ฐ๋ฐ์ ๊ธฐ์ด์์ง๋ง, ๋๊ท๋ชจ ๋ฐ์ดํฐ ์์์ฑ์ ์ํ ์ ์ฉ์ฑ์ ๊ฐ์ํ์ต๋๋ค.
์ฟ ํค์ ์ฅ์ :
- ๋ณดํธ์ ์ธ ๋ธ๋ผ์ฐ์ ์ง์: ๊ฑฐ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ์ด ์ฟ ํค๋ฅผ ์ง์ํ๋ฏ๋ก ๋ค์ํ ์ฌ์ฉ์ ๊ธฐ๋ฐ์์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋งค์ฐ ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์๋ฒ ์ํธ์์ฉ: ์ฟ ํค๊ฐ ์์ฑ๋ ๋๋ฉ์ธ์ ๋ํ ๋ชจ๋ HTTP ์์ฒญ๊ณผ ํจ๊ป ์๋์ผ๋ก ์ ์ก๋๋ฏ๋ก ์ธ์ ๊ด๋ฆฌ, ์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ์ถ์ ์ ์ด์์ ์ ๋๋ค.
- ๋ง๋ฃ ์ ์ด: ๊ฐ๋ฐ์๋ ๋ง๋ฃ ๋ ์ง๋ฅผ ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ด ๋ ์ง ์ดํ์๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋์ผ๋ก ์ฟ ํค๋ฅผ ์ญ์ ํฉ๋๋ค.
์ฟ ํค์ ๋จ์ :
- ์์ ์ ์ฅ ์ฉ๋ ์ ํ: ์ผ๋ฐ์ ์ผ๋ก ์ฟ ํค๋น ์ฝ 4KB๋ก ์ ํ๋๋ฉฐ, ๋๋ฉ์ธ๋น ์ต๋ 20-50๊ฐ์ ์ฟ ํค๋ง ํ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด๋ก ์ธํด ์๋นํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ์๋ ๋ถ์ ํฉํฉ๋๋ค.
- ๋ชจ๋ ์์ฒญ๊ณผ ํจ๊ป ์ ์ก: ์ด๋ ๋คํธ์ํฌ ํธ๋ํฝ๊ณผ ์ค๋ฒํค๋๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์์ผ๋ฉฐ, ํนํ ๋ง์ ์ฟ ํค๋ ํฐ ์ฟ ํค๊ฐ ์์ ๊ฒฝ์ฐ ์ผ๋ถ ์ง์ญ์์ ํํ ๋๋ฆฐ ๋คํธ์ํฌ์์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ๋ณด์ ์ฐ๋ ค: ์ ์คํ๊ฒ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ฌ์ดํธ ๊ฐ ์คํฌ๋ฆฝํ (XSS) ๊ณต๊ฒฉ์ ์ทจ์ฝํ๋ฉฐ, `HttpOnly` ๋ฐ `Secure` ํ๋๊ทธ๋ก ์ ์ ํ ์ํธํํ๊ณ ๋ณดํธํ์ง ์๋ ํ ๋ฏผ๊ฐํ ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ๋ํด ์ผ๋ฐ์ ์ผ๋ก ์์ ํ์ง ์์ต๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ณต์ก์ฑ: `document.cookie`๋ฅผ ์ง์ ์กฐ์ํ๋ ๊ฒ์ ๋ฌธ์์ด ๊ธฐ๋ฐ ์ธํฐํ์ด์ค ๋๋ฌธ์ ๋ฒ๊ฑฐ๋กญ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
- ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ: ๋ง์ ๊ดํ ๊ถ์์ ๋ช ์์ ์ธ ์ฌ์ฉ์ ๋์๋ฅผ ์๊ตฌํ๋ ์๊ฒฉํ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ (์: GDPR, CCPA)์ ์ ์ฉ์ ๋ฐ์ผ๋ฉฐ, ์ด๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ ๋ํฉ๋๋ค.
์ฟ ํค์ ์ฌ์ฉ ์ฌ๋ก:
- ์ธ์ ๊ด๋ฆฌ: ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํ ์ธ์ ID ์ ์ฅ.
- ์ฌ์ฉ์ ์ธ์ฆ: '๋ก๊ทธ์ธ ์ํ ์ ์ง' ์ ํธ๋๋ ์ธ์ฆ ํ ํฐ ๊ธฐ์ต.
- ๊ฐ์ธํ: ๋์ ์ฉ๋์ด ํ์ํ์ง ์์ ํ ๋ง ์ ํ๊ณผ ๊ฐ์ ๋งค์ฐ ์์ ์ฌ์ฉ์ ์ ํธ๋ ์ ์ฅ.
- ์ถ์ : ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฌธ์ ๋ก ์ธํด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ ๋์ฒด๋๊ณ ์์ง๋ง, ์ญ์ฌ์ ์ผ๋ก ์ฌ์ฉ์ ํ๋ ์ถ์ ์ ์ฌ์ฉ๋์์ต๋๋ค.
์น ์คํ ๋ฆฌ์ง: localStorage์ sessionStorage โ ํค-๊ฐ ์ ์ฅ์ ์๋ฅ์ด
`localStorage`์ `sessionStorage`๋ก ๊ตฌ์ฑ๋ ์น ์คํ ๋ฆฌ์ง API๋ ์ฟ ํค๋ณด๋ค ๋ ๊ฐ๋จํ๊ณ ๋๋ํ ํด๋ผ์ด์ธํธ ์ธก ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ํค์ ๊ฐ ๋ชจ๋ ๋ฌธ์์ด๋ก ์ ์ฅ๋๋ ํค-๊ฐ ์ ์ฅ์๋ก ์๋ํฉ๋๋ค.
localStorage: ์ธ์ ๊ฐ ์๊ตฌ ๋ฐ์ดํฐ
localStorage๋ ์๊ตฌ์ ์ธ ์คํ ๋ฆฌ์ง๋ฅผ ์ ๊ณตํฉ๋๋ค. `localStorage`์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋ซ์๋ค๊ฐ ๋ค์ ์ด๊ฑฐ๋ ์ปดํจํฐ๋ฅผ ์ฌ์์ํ ํ์๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ์ฌ์ฉ์๊ฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด, ๋๋ ๋ธ๋ผ์ฐ์ ์ค์ ์ ์ํด ๋ช ์์ ์ผ๋ก ์ง์์ง ๋๊น์ง ๋ณธ์ง์ ์ผ๋ก ์๊ตฌ์ ์ ๋๋ค.
sessionStorage: ํ์ฌ ์ธ์ ๋ง์ ์ํ ๋ฐ์ดํฐ
sessionStorage๋ ๋จ์ผ ๋ธ๋ผ์ฐ์ ์ธ์ ๋์๋ง ์์ ์คํ ๋ฆฌ์ง๋ฅผ ์ ๊ณตํฉ๋๋ค. `sessionStorage`์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๋ธ๋ผ์ฐ์ ํญ์ด๋ ์ฐฝ์ด ๋ซํ ๋ ์ง์์ง๋๋ค. ์ด๋ ์ค๋ฆฌ์ง(๋๋ฉ์ธ)๊ณผ ํน์ ๋ธ๋ผ์ฐ์ ํญ์ ๊ณ ์ ํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋์ผํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด ๋ ๊ฐ์ ํญ์ ์ด๋ฉด ๋ณ๋์ `sessionStorage` ์ธ์คํด์ค๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
์น ์คํ ๋ฆฌ์ง์ ์ฅ์ :
- ๋ ํฐ ์ฉ๋: ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฆฌ์ง๋น 5MB์์ 10MB์ ์คํ ๋ฆฌ์ง๋ฅผ ์ ๊ณตํ์ฌ ์ฟ ํค๋ณด๋ค ํจ์ฌ ๋ง์ผ๋ฏ๋ก ๋ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ ์ฉ์ด์ฑ: `setItem()`, `getItem()`, `removeItem()`, `clear()` ๋ฉ์๋๋ฅผ ๊ฐ์ถ ๊ฐ๋จํ API๋ก ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ๊ฐ๋จํฉ๋๋ค.
- ์๋ฒ ์ค๋ฒํค๋ ์์: ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ HTTP ์์ฒญ๊ณผ ํจ๊ป ์๋์ผ๋ก ์ ์ก๋์ง ์์ผ๋ฏ๋ก ๋คํธ์ํฌ ํธ๋ํฝ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋ ๋์ ์ฑ๋ฅ: ์์ํ๊ฒ ํด๋ผ์ด์ธํธ ์ธก์์ ์๋ํ๋ฏ๋ก ์ฟ ํค์ ๋นํด ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ ์ด ๋ ๋น ๋ฆ ๋๋ค.
์น ์คํ ๋ฆฌ์ง์ ๋จ์ :
- ๋๊ธฐ์ API: ๋ชจ๋ ์์ ์ด ๋๊ธฐ์์ด์ด์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ ์ ์์ผ๋ฉฐ, ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ ๋๋ฆฐ ์ฅ์น๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค. ์ด๋ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ , ํนํ ์ฅ์น ์ฑ๋ฅ์ด ๋ฎ์ ์ ์๋ ์ ํฅ ์์ฅ์์ ์ค์ํ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค.
- ๋ฌธ์์ด ์ ์ฉ ์ ์ฅ์: ๋ชจ๋ ๋ฐ์ดํฐ๋ ์ ์ฅํ๊ธฐ ์ ์ ๋ฌธ์์ด๋ก ๋ณํ(์: `JSON.stringify()`)ํด์ผ ํ๋ฉฐ, ๊ฒ์ ์ ๋ค์ ํ์ฑ(`JSON.parse()`)ํด์ผ ํ๋ฏ๋ก ๋ณต์กํ ๋ฐ์ดํฐ ์ ํ์ ๋ํ ์ถ๊ฐ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
- ์ ํ๋ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ: ๋ณต์กํ ์ฟผ๋ฆฌ, ์ธ๋ฑ์ฑ ๋๋ ํธ๋์ญ์ ์ ์ํ ๋ด์ฅ ๋ฉ์ปค๋์ฆ์ด ์์ต๋๋ค. ์ค์ง ํค๋ก๋ง ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ณด์: ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๊ฐ `localStorage` ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ผ๋ฏ๋ก XSS ๊ณต๊ฒฉ์ ์ทจ์ฝํฉ๋๋ค. ์ํธํ๋์ง ์์ ๋ฏผ๊ฐํ ์ฌ์ฉ์ ๋ฐ์ดํฐ์๋ ์ ํฉํ์ง ์์ต๋๋ค.
- ๋์ผ ์ถ์ฒ ์ ์ฑ : ๋ฐ์ดํฐ๋ ๋์ผํ ์ค๋ฆฌ์ง(ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ)์ ํ์ด์ง์์๋ง ์ ๊ทผํ ์ ์์ต๋๋ค.
localStorage์ ์ฌ์ฉ ์ฌ๋ก:
- ์คํ๋ผ์ธ ๋ฐ์ดํฐ ์บ์ฑ: ์คํ๋ผ์ธ์์ ์ ๊ทผํ๊ฑฐ๋ ํ์ด์ง ์ฌ๋ฐฉ๋ฌธ ์ ๋น ๋ฅด๊ฒ ๋ก๋ํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ ์ ์ฅ.
- ์ฌ์ฉ์ ์ ํธ๋: UI ํ ๋ง, ์ธ์ด ์ ํ(๊ธ๋ก๋ฒ ์ฑ์ ์ค์) ๋๋ ๊ธฐํ ๋ฏผ๊ฐํ์ง ์์ ์ฌ์ฉ์ ์ค์ ๊ธฐ์ต.
- ์ผํ ์นดํธ ๋ฐ์ดํฐ: ์ธ์ ๊ฐ์ ์ฌ์ฉ์์ ์ผํ ์นดํธ์ ์๋ ํญ๋ชฉ ์ ์ง.
- ๋์ค์ ์ฝ์ ์ฝํ ์ธ : ๋์ค์ ๋ณผ ๊ธฐ์ฌ๋ ์ฝํ ์ธ ์ ์ฅ.
sessionStorage์ ์ฌ์ฉ ์ฌ๋ก:
- ๋ค๋จ๊ณ ์์: ๋จ์ผ ์ธ์ ๋ด์์ ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์์์ ๋จ๊ณ ๊ฐ ์ฌ์ฉ์ ์ ๋ ฅ ๋ณด์กด.
- ์์ UI ์ํ: ํ์ฌ ํญ์ ๋์ด ์ง์๋์ด์๋ ์ ๋๋ ์ผ์์ ์ธ UI ์ํ ์ ์ฅ(์: ์ธ์ ๋ด ํํฐ ์ ํ, ๊ฒ์ ๊ฒฐ๊ณผ).
- ๋ฏผ๊ฐํ ์ธ์ ๋ฐ์ดํฐ: ํญ์ด ๋ซํ ๋ ์ฆ์ ์ง์์ ธ์ผ ํ๋ ๋ฐ์ดํฐ ์ ์ฅ, ํน์ ์ผ์์ ๋ฐ์ดํฐ์ ๋ํด `localStorage`๋ณด๋ค ์ฝ๊ฐ์ ๋ณด์ ์ด์ ์ ๊ณต.
IndexedDB: ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ ๊ฐ๋ ฅํ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค
IndexedDB๋ ํ์ผ๊ณผ ๋ธ๋กญ์ ํฌํจํ์ฌ ์๋นํ ์์ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅํ๊ธฐ ์ํ ์ ์์ค API์ ๋๋ค. SQL ๊ธฐ๋ฐ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฌํ์ง๋ง NoSQL, ๋ฌธ์ ๋ชจ๋ธ ํจ๋ฌ๋ค์์์ ์๋ํ๋ ํธ๋์ญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ๋๋ค. ๋ณต์กํ ๋ฐ์ดํฐ ์ ์ฅ ์๊ตฌ์ ๋ง๊ฒ ์ค๊ณ๋ ๊ฐ๋ ฅํ๊ณ ๋น๋๊ธฐ์ ์ธ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
IndexedDB์ ์ฅ์ :
- ๋์ฉ๋ ์ ์ฅ ๊ณต๊ฐ: ๋ธ๋ผ์ฐ์ ๋ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ๋์คํฌ ๊ณต๊ฐ์ ๋ฐ๋ผ ์ข ์ข ๊ธฐ๊ฐ๋ฐ์ดํธ ๋จ์์ ํจ์ฌ ํฐ ์ ์ฅ ์ฉ๋ ์ ํ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ, ๋ฏธ๋์ด ๋๋ ํฌ๊ด์ ์ธ ์คํ๋ผ์ธ ์บ์๋ฅผ ์ ์ฅํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ ๋๋ค.
- ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์ ์ฅ: ๋ณต์กํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ์์ด ์ง์ ์ ์ฅํ ์ ์์ด ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์ ๋งค์ฐ ํจ์จ์ ์ ๋๋ค.
- ๋น๋๊ธฐ ์์ : ๋ชจ๋ ์์ ์ด ๋น๋๊ธฐ์์ด์ด์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋ฌด๊ฑฐ์ด ๋ฐ์ดํฐ ์์ ์์๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์น ์คํ ๋ฆฌ์ง์ ๋นํด ํฐ ์ฅ์ ์ ๋๋ค.
- ํธ๋์ญ์ : ์์์ ํธ๋์ญ์ ์ ์ง์ํ์ฌ ์ฌ๋ฌ ์์ ์ด ๋จ์ผ ๋จ์๋ก ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ๋๋ก ํ์ฌ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์ธ๋ฑ์ค ๋ฐ ์ฟผ๋ฆฌ: ๊ฐ์ฒด ์ ์ฅ์ ์์ฑ์ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์ฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์คํ๋ผ์ธ ๊ธฐ๋ฅ: ๊ฐ๋ ฅํ ์คํ๋ผ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ํ์ํ ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ(PWA)์ ์ด์์ ๋๋ค.
IndexedDB์ ๋จ์ :
- ๋ณต์กํ API: API๊ฐ ์น ์คํ ๋ฆฌ์ง๋ ์ฟ ํค๋ณด๋ค ํจ์ฌ ๋ณต์กํ๊ณ ์ฅํฉํ์ฌ ํ์ต ๊ณก์ ์ด ๊ฐํ๋ฆ ๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ข ์ข ์ฌ์ฉ์ ๋จ์ํํ๊ธฐ ์ํด ๋ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: LocalForage)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋๋ฒ๊น ์ ์ด๋ ค์: IndexedDB ๋๋ฒ๊น ์ ๋ ๊ฐ๋จํ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ๋นํด ๋ ๋ณต์กํ ์ ์์ต๋๋ค.
- ์ง์ ์ ์ธ SQL๊ณผ ์ ์ฌํ ์ฟผ๋ฆฌ ์์: ์ธ๋ฑ์ค๋ฅผ ์ง์ํ์ง๋ง ์ต์ํ SQL ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์ ์ ๊ณตํ์ง ์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ฐ๋ณต๊ณผ ํํฐ๋ง์ด ํ์ํฉ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๋ถ์ผ์น: ๋๋ฆฌ ์ง์๋์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ๊ตฌํ์ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ๋๋๋ก ์ฌ์ํ ํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋, ํ์ฌ๋ ์ด๋ฌํ ๊ฒฝ์ฐ๊ฐ ๋๋ญ ๋๋ค.
IndexedDB์ ์ฌ์ฉ ์ฌ๋ก:
- ์คํ๋ผ์ธ ์ฐ์ ์ ํ๋ฆฌ์ผ์ด์ : ์ํํ ์คํ๋ผ์ธ ์ ๊ทผ์ ์ํด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ ์ธํธ, ์ฌ์ฉ์ ์์ฑ ์ฝํ ์ธ ๋๋ ๋์ฉ๋ ๋ฏธ๋์ด ํ์ผ ์ ์ฅ(์: ์ด๋ฉ์ผ ํด๋ผ์ด์ธํธ, ๋ฉ๋ชจ ์ฑ, ์ ์ ์๊ฑฐ๋ ์ ํ ์นดํ๋ก๊ทธ).
- ๋ณต์กํ ๋ฐ์ดํฐ ์บ์ฑ: ๋น๋ฒํ ์ฟผ๋ฆฌ๋ ํํฐ๋ง์ด ํ์ํ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ์บ์ฑ.
- ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ(PWA): PWA์์ ํ๋ถํ ์คํ๋ผ์ธ ๊ฒฝํ๊ณผ ๊ณ ์ฑ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ๋ณธ ๊ธฐ์ .
- ๋ก์ปฌ ๋ฐ์ดํฐ ๋๊ธฐํ: ๋ฐฑ์๋ ์๋ฒ์ ๋๊ธฐํํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ๊ฒฌ๊ณ ํ ๋ก์ปฌ ์บ์ ์ ๊ณต.
Cache API (์๋น์ค ์์ปค): ๋คํธ์ํฌ ์์ฒญ ๋ฐ ์์ฐ์ ์ํ API
์ผ๋ฐ์ ์ผ๋ก ์๋น์ค ์์ปค์ ํจ๊ป ์ฌ์ฉ๋๋ Cache API๋ ๋ธ๋ผ์ฐ์ ์ HTTP ์บ์๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ ๋คํธ์ํฌ ์์ฒญ(์๋ต ํฌํจ)์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๊ณ ๊ฒ์ํ ์ ์๊ฒ ํ์ฌ ๊ฐ๋ ฅํ ์คํ๋ผ์ธ ๊ธฐ๋ฅ๊ณผ ์ฆ๊ฐ์ ์ธ ๋ก๋ฉ ๊ฒฝํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
Cache API์ ์ฅ์ :
- ๋คํธ์ํฌ ์์ฒญ ์บ์ฑ: HTML, CSS, ์๋ฐ์คํฌ๋ฆฝํธ, ์ด๋ฏธ์ง ๋ฐ ๊ธฐํ ์์ฐ๊ณผ ๊ฐ์ ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ์บ์ฑํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค.
- ์คํ๋ผ์ธ ์ ๊ทผ: ์คํ๋ผ์ธ ์ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ PWA๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ด๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ์์ ๋๋ ์์ฐ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ: ์บ์๋ ์ฝํ ์ธ ๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ฆ์ ์ ๊ณตํ์ฌ ๋ฐ๋ณต ๋ฐฉ๋ฌธ ์ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
- ์ธ๋ถํ๋ ์ ์ด: ๊ฐ๋ฐ์๋ ์๋น์ค ์์ปค ์ ๋ต(์: ์บ์ ์ฐ์ , ๋คํธ์ํฌ ์ฐ์ , stale-while-revalidate)์ ์ฌ์ฉํ์ฌ ๋ฌด์์, ์ธ์ , ์ด๋ป๊ฒ ์บ์ํ ์ง ์ ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
- ๋น๋๊ธฐ์: ๋ชจ๋ ์์ ์ด ๋น๋๊ธฐ์์ด์ด์ UI ์ฐจ๋จ์ ๋ฐฉ์งํฉ๋๋ค.
Cache API์ ๋จ์ :
- ์๋น์ค ์์ปค ์๊ตฌ ์ฌํญ: ๊ฐ๋ ฅํ์ง๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ์ ๋ณต์ก์ฑ์ ๋ํ๊ณ ํ๋ก๋์ ํ๊ฒฝ์์๋ HTTPS๋ฅผ ์๊ตฌํ๋ ์๋น์ค ์์ปค์ ์์กดํฉ๋๋ค.
- ์ ์ฅ ์ฉ๋ ์ ํ: ๋๋ํ์ง๋ง, ์ ์ฅ ๊ณต๊ฐ์ ๊ถ๊ทน์ ์ผ๋ก ์ฌ์ฉ์์ ์ฅ์น ๋ฐ ๋ธ๋ผ์ฐ์ ํ ๋น๋์ ์ํด ์ ํ๋๋ฉฐ, ์๋ฐ์ ๋ฐ์ผ๋ฉด ์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
- ์์์ ๋ฐ์ดํฐ์๋ ๋ถ์ ํฉ: ์ฃผ๋ก HTTP ์์ฒญ๊ณผ ์๋ต์ ์บ์ฑํ๊ธฐ ์ํ ๊ฒ์ด์ง IndexedDB์ฒ๋ผ ์์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋๋ค.
- ๋๋ฒ๊น ๋ณต์ก์ฑ: ์๋น์ค ์์ปค์ Cache API์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํน์ฑ๊ณผ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ ๋๋ฌธ์ ๋๋ฒ๊น ์ด ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
Cache API์ ์ฌ์ฉ ์ฌ๋ก:
- ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ(PWA): ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ธ ์์ฐ์ ์บ์ฑํ์ฌ ์ฆ๊ฐ์ ์ธ ๋ก๋ฉ๊ณผ ์คํ๋ผ์ธ ์ ๊ทผ์ ๋ณด์ฅํฉ๋๋ค.
- ์คํ๋ผ์ธ ์ฝํ ์ธ : ์ฌ์ฉ์๊ฐ ์ฐ๊ฒฐ์ด ๋๊ฒผ์ ๋ ๋ณผ ์ ์๋๋ก ์ ์ ์ฝํ ์ธ , ๊ธฐ์ฌ ๋๋ ์ ํ ์ด๋ฏธ์ง๋ฅผ ์บ์ฑํฉ๋๋ค.
- ์ฌ์ ์บ์ฑ: ํฅํ ์ฌ์ฉ์ ์ํด ํ์ ๋ฆฌ์์ค๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋ํ์ฌ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋คํธ์ํฌ ๋ณต์๋ ฅ: ๋คํธ์ํฌ ์์ฒญ์ด ์คํจํ ๋ ๋์ฒด ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์น SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค (์ฌ์ฉ ์ค๋จ๋จ)
SQL์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌํ ์ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ API์ธ ์น SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ๋ตํ๊ฒ ์ธ๊ธํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์์ ์ง์ SQL๊ณผ ์ ์ฌํ ๊ฒฝํ์ ์ ๊ณตํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ณต๊ธ์ ์ฒด ๊ฐ์ ํ์คํ๋ ์ฌ์์ด ๋ถ์กฑํ์ฌ 2010๋ W3C์ ์ํด ์ฌ์ฉ์ด ์ค๋จ๋์์ต๋๋ค. ์ผ๋ถ ๋ธ๋ผ์ฐ์ ๋ ๋ ๊ฑฐ์์์ ์ด์ ๋ก ์ฌ์ ํ ์ง์ํ์ง๋ง, ์๋ก์ด ๊ฐ๋ฐ์๋ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. IndexedDB๋ ๊ตฌ์กฐํ๋ ํด๋ผ์ด์ธํธ ์ธก ๋ฐ์ดํฐ ์ ์ฅ์ ์ํ ํ์คํ๋ ํ๋์ ํ์ ๊ธฐ์ ๋ก ๋ฑ์ฅํ์ต๋๋ค.
์ฌ๋ฐ๋ฅธ ์ ๋ต ์ ํ: ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ํ ๊ณ ๋ ค ์ฌํญ
์ ์ ํ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ ์ ํํ๋ ๊ฒ์ ์ฑ๋ฅ, ์ฌ์ฉ์ ๊ฒฝํ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ๊ฒฌ๊ณ ์ฑ์ ์ํฅ์ ๋ฏธ์น๋ ์ค์ํ ๊ฒฐ์ ์ ๋๋ค. ํนํ ๋ค์ํ ์ฅ์น ๊ธฐ๋ฅ๊ณผ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ฐ์ง ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ๋์์ผ๋ก ๊ตฌ์ถํ ๋ ๊ณ ๋ คํด์ผ ํ ์ฃผ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฐ์ดํฐ ํฌ๊ธฐ ๋ฐ ์ ํ:
- ์ฟ ํค: ๋งค์ฐ ์์ ๊ฐ๋จํ ๋ฌธ์์ด ๋ฐ์ดํฐ(4KB ๋ฏธ๋ง).
- ์น ์คํ ๋ฆฌ์ง (localStorage/sessionStorage): ์๊ฑฐ๋ ์ค๊ฐ ํฌ๊ธฐ์ ํค-๊ฐ ๋ฌธ์์ด ๋ฐ์ดํฐ(5-10MB).
- IndexedDB: ๋ณต์กํ ์ฟผ๋ฆฌ๋ ์คํ๋ผ์ธ ์ ๊ทผ์ด ํ์ํ ๋์ฉ๋ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ, ๊ฐ์ฒด ๋ฐ ๋ฐ์ด๋๋ฆฌ ํ์ผ(GB ๋จ์).
- Cache API: ์คํ๋ผ์ธ ๊ฐ์ฉ์ฑ ๋ฐ ์ฑ๋ฅ์ ์ํ ๋คํธ์ํฌ ์์ฒญ ๋ฐ ๊ทธ ์๋ต(HTML, CSS, JS, ์ด๋ฏธ์ง, ๋ฏธ๋์ด).
- ์์์ฑ ์๊ตฌ ์ฌํญ:
- sessionStorage: ๋ฐ์ดํฐ๋ ํ์ฌ ๋ธ๋ผ์ฐ์ ํญ ์ธ์ ๋์๋ง ์ง์๋ฉ๋๋ค.
- ์ฟ ํค (๋ง๋ฃ์ผ ํฌํจ): ๋ฐ์ดํฐ๋ ๋ง๋ฃ์ผ ๋๋ ๋ช ์์ ์ญ์ ์๊น์ง ์ง์๋ฉ๋๋ค.
- localStorage: ๋ฐ์ดํฐ๋ ๋ช ์์ ์ผ๋ก ์ง์์ง ๋๊น์ง ๋ฌด๊ธฐํ ์ง์๋ฉ๋๋ค.
- IndexedDB & Cache API: ๋ฐ์ดํฐ๋ ์ ํ๋ฆฌ์ผ์ด์ , ์ฌ์ฉ์ ๋๋ ๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง ๊ด๋ฆฌ(์: ๋ฎ์ ๋์คํฌ ๊ณต๊ฐ)์ ์ํด ๋ช ์์ ์ผ๋ก ์ง์์ง ๋๊น์ง ๋ฌด๊ธฐํ ์ง์๋ฉ๋๋ค.
- ์ฑ๋ฅ (๋๊ธฐ์ vs. ๋น๋๊ธฐ์):
- ์ฟ ํค & ์น ์คํ ๋ฆฌ์ง: ๋๊ธฐ์ ์์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ, ํนํ ์ผ๋ถ ๊ธ๋ก๋ฒ ์ง์ญ์์ ํํ ์ ์ฑ๋ฅ ์ฅ์น์์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ UI ๋ฒ๋ฒ ๊ฑฐ๋ฆผ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
- IndexedDB & Cache API: ๋น๋๊ธฐ์ ์์ ์ UI๋ฅผ ์ฐจ๋จํ์ง ์์ผ๋ฏ๋ก ๋ณต์กํ ๋ฐ์ดํฐ๋ ๋๋ฆฐ ํ๋์จ์ด์์๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋ณด์ ๋ฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ:
- ๋ชจ๋ ํด๋ผ์ด์ธํธ ์ธก ์คํ ๋ฆฌ์ง๋ ์ ์ ํ ๋ณดํธ๋์ง ์์ผ๋ฉด XSS์ ์ทจ์ฝํฉ๋๋ค. ๋งค์ฐ ๋ฏผ๊ฐํ๊ณ ์ํธํ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ง์ ์ ์ฅํ์ง ๋ง์ญ์์ค.
- ์ฟ ํค๋ ๋ณด์ ๊ฐํ๋ฅผ ์ํด `HttpOnly` ๋ฐ `Secure` ํ๋๊ทธ๋ฅผ ์ ๊ณตํ์ฌ ์ธ์ฆ ํ ํฐ์ ์ ํฉํฉ๋๋ค.
- ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ์๊ณผ ๋์๊ฐ ํ์ํ ์์ ์ ๊ท์ ํ๋ ๋ฐ์ดํฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ (GDPR, CCPA ๋ฑ)์ ๊ณ ๋ คํ์ญ์์ค.
- ์คํ๋ผ์ธ ์ ๊ทผ ๋ฐ PWA ์๊ตฌ ์ฌํญ:
- ๊ฐ๋ ฅํ ์คํ๋ผ์ธ ๊ธฐ๋ฅ๊ณผ ์์ ํ ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ์ ์ํด์๋ IndexedDB์ Cache API (์๋น์ค ์์ปค๋ฅผ ํตํด)๊ฐ ํ์์ ์ ๋๋ค. ์ด๋ค์ ์คํ๋ผ์ธ ์ฐ์ ์ ๋ต์ ๊ทผ๊ฐ์ ์ด๋ฃน๋๋ค.
- ๋ธ๋ผ์ฐ์ ์ง์:
- ์ฟ ํค๋ ๊ฑฐ์ ๋ณดํธ์ ์ธ ์ง์์ ๋ฐ์ต๋๋ค.
- ์น ์คํ ๋ฆฌ์ง๋ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ํ๋ฅญํ ์ง์์ ๋ฐ์ต๋๋ค.
- IndexedDB์ Cache API / ์๋น์ค ์์ปค๋ ๋ชจ๋ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ๋ ฅํ ์ง์์ ๋ฐ์ง๋ง, ์ค๋๋๊ฑฐ๋ ๋ ํํ ๋ธ๋ผ์ฐ์ ์์๋ ์ ํ์ด ์์ ์ ์์ต๋๋ค(์ฑํ๋ฅ ์ ๋๋ฆฌ ํผ์ ธ ์์).
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ค์ฉ์ ์ธ ๊ตฌํ: ์ ๋ต์ ์ ๊ทผ
์ด๋ฌํ ์คํ ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ํธ ์์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ณต์กํ ์ฝ๋ ๋ธ๋ก ์์ด ํต์ฌ ๋ฉ์๋์ ์ด์ ์ ๋ง์ถฐ ์์น์ ์ค๋ช ํฉ๋๋ค.
localStorage ๋ฐ sessionStorage ์ฌ์ฉํ๊ธฐ
์ด API๋ค์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ฌธ์์ด๋ก ์ ์ฅ๋๊ณ ๊ฒ์๋์ด์ผ ํจ์ ๊ธฐ์ตํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ: `localStorage.setItem('key', 'value')` ๋๋ `sessionStorage.setItem('key', 'value')`๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒฝ์ฐ, ๋จผ์ `JSON.stringify(yourObject)`๋ฅผ ์ฌ์ฉํ์ธ์.
- ๋ฐ์ดํฐ ๊ฒ์ํ๊ธฐ: `localStorage.getItem('key')` ๋๋ `sessionStorage.getItem('key')`๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ค๋ฉด, `JSON.parse(retrievedString)`๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ๋ณํํ์ธ์.
- ํน์ ํญ๋ชฉ ์ ๊ฑฐํ๊ธฐ: `localStorage.removeItem('key')` ๋๋ `sessionStorage.removeItem('key')`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๋ชจ๋ ํญ๋ชฉ ์ง์ฐ๊ธฐ: `localStorage.clear()` ๋๋ `sessionStorage.clear()`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ ์๋๋ฆฌ์ค: ์ฌ์ฉ์ ์ ํธ๋๋ฅผ ์ ์ญ์ ์ผ๋ก ์ ์ฅํ๊ธฐ
์ฌ์ฉ์๊ฐ ์ ํธํ๋ ์ธ์ด๋ฅผ ์ ํํ ์ ์๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํด ๋ณด์ธ์. ์ด๋ฅผ `localStorage`์ ์ ์ฅํ์ฌ ์ธ์ ๊ฐ์ ์ ์งํ ์ ์์ต๋๋ค.
์ธ์ด ์ ํธ๋ ์ค์ :
localStorage.setItem('userLanguage', 'ko-KR');
์ธ์ด ์ ํธ๋ ๊ฒ์:
const preferredLang = localStorage.getItem('userLanguage');
if (preferredLang) {
// ์ ํ๋ฆฌ์ผ์ด์
UI์ preferredLang ์ ์ฉ
}
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฟ ํค ๊ด๋ฆฌํ๊ธฐ
`document.cookie`๋ฅผ ์ฌ์ฉํ ์ง์ ์ ์ธ ์ฟ ํค ์กฐ์์ ๊ฐ๋ฅํ์ง๋ง ๋ณต์กํ ์๊ตฌ์๋ ๋ฒ๊ฑฐ๋ก์ธ ์ ์์ต๋๋ค. `document.cookie`๋ฅผ ์ค์ ํ ๋๋ง๋ค ์ ์ฒด ๋ฌธ์์ด์ ๋ฎ์ด์ฐ๋ ๊ฒ์ด ์๋๋ผ ๋จ์ผ ์ฟ ํค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ๋๋ค.
- ์ฟ ํค ์ค์ ํ๊ธฐ: `document.cookie = 'name=value; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/'`. ์ ์ ํ ์ ์ด๋ฅผ ์ํด ๋ง๋ฃ ๋ ์ง์ ๊ฒฝ๋ก๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. ๋ง๋ฃ์ผ์ด ์์ผ๋ฉด ์ธ์ ์ฟ ํค๊ฐ ๋ฉ๋๋ค.
- ์ฟ ํค ๊ฒ์ํ๊ธฐ: `document.cookie`๋ ํ์ฌ ๋ฌธ์์ ๋ชจ๋ ์ฟ ํค๋ฅผ ์ธ๋ฏธ์ฝ๋ก ์ผ๋ก ๊ตฌ๋ถ๋ ๋จ์ผ ๋ฌธ์์ด๋ก ๋ฐํํฉ๋๋ค. ๊ฐ๋ณ ์ฟ ํค ๊ฐ์ ์ถ์ถํ๋ ค๋ฉด ์ด ๋ฌธ์์ด์ ์๋์ผ๋ก ํ์ฑํด์ผ ํฉ๋๋ค.
- ์ฟ ํค ์ญ์ ํ๊ธฐ: ๋ง๋ฃ ๋ ์ง๋ฅผ ๊ณผ๊ฑฐ ๋ ์ง๋ก ์ค์ ํฉ๋๋ค.
์์ ์๋๋ฆฌ์ค: ๊ฐ๋จํ ์ฌ์ฉ์ ํ ํฐ ์ ์ฅํ๊ธฐ (๋จ๊ธฐ๊ฐ ๋์)
ํ ํฐ ์ฟ ํค ์ค์ :
const expirationDate = new Date();
expirationDate.setTime(expirationDate.getTime() + (30 * 24 * 60 * 60 * 1000)); // 30์ผ
document.cookie = `authToken=someSecureToken123; expires=${expirationDate.toUTCString()}; path=/; Secure; HttpOnly`;
์ฐธ๊ณ : `Secure` ๋ฐ `HttpOnly` ํ๋๊ทธ๋ ๋ณด์์ ์ค์ํ๋ฉฐ, ์๋ฒ๊ฐ ์ฟ ํค๋ฅผ ๋ณด๋ผ ๋ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ `HttpOnly`๋ฅผ ์ง์ ์ค์ ํ ์ ์์ต๋๋ค.
IndexedDB์ ์ํธ์์ฉํ๊ธฐ
IndexedDB์ API๋ ๋น๋๊ธฐ์์ด๋ฉฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ด๊ณ , ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ๋ง๋ค๊ณ , ํธ๋์ญ์ ๋ด์์ ์์ ์ ์ํํ๋ ๊ณผ์ ์ด ํฌํจ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐ: `indexedDB.open('dbName', version)`์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ `IDBOpenDBRequest`๋ฅผ ๋ฐํํฉ๋๋ค. `onsuccess`์ `onupgradeneeded` ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ธ์.
- ๊ฐ์ฒด ์ ์ฅ์ ๋ง๋ค๊ธฐ: ์ด๋ `onupgradeneeded` ์ด๋ฒคํธ์์ ๋ฐ์ํฉ๋๋ค. `db.createObjectStore('storeName', { keyPath: 'id', autoIncrement: true })`๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค ์๋ ์์ต๋๋ค.
- ํธ๋์ญ์ : ๋ชจ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์ ์ ํธ๋์ญ์ ๋ด์์ ๋ฐ์ํด์ผ ํฉ๋๋ค. `db.transaction(['storeName'], 'readwrite')` (๋๋ `'readonly'`)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ฐ์ฒด ์ ์ฅ์ ์์ : ํธ๋์ญ์ ์์ ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค(์: `transaction.objectStore('storeName')`). ๊ทธ๋ฐ ๋ค์ `add()`, `put()`, `get()`, `delete()`์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ด๋ฒคํธ ์ฒ๋ฆฌ: ๊ฐ์ฒด ์ ์ฅ์์ ๋ํ ์์ ์ ์์ฒญ์ ๋ฐํํฉ๋๋ค. ์ด ์์ฒญ์ ๋ํ `onsuccess`์ `onerror`๋ฅผ ์ฒ๋ฆฌํ์ธ์.
์์ ์๋๋ฆฌ์ค: ์คํ๋ผ์ธ ์ ์ ์๊ฑฐ๋๋ฅผ ์ํ ๋์ฉ๋ ์ ํ ์นดํ๋ก๊ทธ ์ ์ฅ
์คํ๋ผ์ธ ์ํ์์๋ ์ ํ ๋ชฉ๋ก์ ํ์ํด์ผ ํ๋ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ธ์. IndexedDB๋ ์ด์ ์๋ฒฝํฉ๋๋ค.
์ ํ ์ ์ฅ์ ์ํ ๋จ์ํ๋ ๋ก์ง:
1. 'products'์ ๋ํ IndexedDB ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๋๋ค.
2. `onupgradeneeded` ์ด๋ฒคํธ์์ ์ ํ ID์ ๋ํ `keyPath`๋ฅผ ๊ฐ์ง 'productData'๋ผ๋ ๊ฐ์ฒด ์ ์ฅ์๋ฅผ ๋ง๋ญ๋๋ค.
3. ์๋ฒ์์ ์ ํ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๋ฉด(์: ๊ฐ์ฒด ๋ฐฐ์ด๋ก), 'productData'์ ๋ํ `readwrite` ํธ๋์ญ์ ์ ๋ง๋ญ๋๋ค.
4. ์ ํ ๋ฐฐ์ด์ ๋ฐ๋ณตํ๊ณ ๊ฐ ์ ํ์ ๋ํด `productStore.put(productObject)`๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธํฉ๋๋ค.
5. ํธ๋์ญ์ ์ `oncomplete` ๋ฐ `onerror` ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์ ํ ๊ฒ์์ ์ํ ๋จ์ํ๋ ๋ก์ง:
1. 'products' ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๋๋ค.
2. 'productData'์ ๋ํ `readonly` ํธ๋์ญ์ ์ ๋ง๋ญ๋๋ค.
3. `productStore.getAll()`์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ ํ์ ๊ฐ์ ธ์ค๊ฑฐ๋, `productStore.get(productId)` ๋๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ปค์ ์์ ์ ํตํด ํน์ ์ ํ์ ์ฟผ๋ฆฌํฉ๋๋ค.
4. ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ์์ฒญ์ `onsuccess` ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
์๋น์ค ์์ปค๋ก Cache API ํ์ฉํ๊ธฐ
Cache API๋ ์ผ๋ฐ์ ์ผ๋ก ์๋น์ค ์์ปค ์คํฌ๋ฆฝํธ ๋ด์์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋น์ค ์์ปค๋ ๋ฉ์ธ ๋ธ๋ผ์ฐ์ ์ค๋ ๋์ ๋ณ๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๋ก, ์คํ๋ผ์ธ ๊ฒฝํ๊ณผ ๊ฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์๋น์ค ์์ปค ๋ฑ๋กํ๊ธฐ: ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์คํฌ๋ฆฝํธ์์: `navigator.serviceWorker.register('/service-worker.js')`.
- ์ค์น ์ด๋ฒคํธ (์๋น์ค ์์ปค ๋ด): `install` ์ด๋ฒคํธ๋ฅผ ์์ ํฉ๋๋ค. ์ด ์์์ `caches.open('cache-name')`์ ์ฌ์ฉํ์ฌ ์บ์๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ฝ๋๋ค. ๊ทธ๋ฐ ๋ค์ `cache.addAll(['/index.html', '/styles.css', '/script.js'])`์ ์ฌ์ฉํ์ฌ ํ์ ์์ฐ์ ์ฌ์ ์บ์ฑํฉ๋๋ค.
- Fetch ์ด๋ฒคํธ (์๋น์ค ์์ปค ๋ด): `fetch` ์ด๋ฒคํธ๋ฅผ ์์ ํฉ๋๋ค. ์ด๋ ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ๋ก์ฑ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์บ์ฑ ์ ๋ต์ ๊ตฌํํ ์ ์์ต๋๋ค:
- ์บ์ ์ฐ์ (Cache-first): `event.respondWith(caches.match(event.request).then(response => response || fetch(event.request)))` (์ฌ์ฉ ๊ฐ๋ฅํ๋ฉด ์บ์์์ ์ ๊ณตํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋คํธ์ํฌ์์ ๊ฐ์ ธ์ต๋๋ค).
- ๋คํธ์ํฌ ์ฐ์ (Network-first): `event.respondWith(fetch(event.request).catch(() => caches.match(event.request)))` (๋คํธ์ํฌ๋ฅผ ๋จผ์ ์๋ํ๊ณ , ์คํ๋ผ์ธ์ด๋ฉด ์บ์๋ก ๋์ฒดํฉ๋๋ค).
์์ ์๋๋ฆฌ์ค: ๋ด์ค ํฌํธ์ ์คํ๋ผ์ธ ์ฐ์ ๊ฒฝํ ์ ๊ณตํ๊ธฐ
๋ด์ค ํฌํธ์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๋ค์ ๋ค์ํ ๊ธ๋ก๋ฒ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ํํ ๊ฐํ์ ์ธ ์ฐ๊ฒฐ ์ํ์์๋ ์ต๊ทผ ๊ธฐ์ฌ๋ฅผ ๋ณผ ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
์๋น์ค ์์ปค ๋ก์ง (๋จ์ํ):
1. ์ค์น ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ธ(๋ ์ด์์, ๋ก๊ณ ์ฉ HTML, CSS, JS)์ ์ฌ์ ์บ์ฑํฉ๋๋ค.
2. `fetch` ์ด๋ฒคํธ์์:
- ํต์ฌ ์์ฐ์ ๋ํด์๋ '์บ์ ์ฐ์ ' ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
- ์๋ก์ด ๊ธฐ์ฌ ์ฝํ ์ธ ์ ๋ํด์๋ '๋คํธ์ํฌ ์ฐ์ ' ์ ๋ต์ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ค๊ณ ์๋ํ๊ณ , ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์บ์๋ ๋ฒ์ ์ผ๋ก ๋์ฒดํฉ๋๋ค.
- ๋คํธ์ํฌ์์ ๊ฐ์ ธ์จ ์๋ก์ด ๊ธฐ์ฌ๋ฅผ ๋์ ์ผ๋ก ์บ์ฑํ๋ฉฐ, ์๋ง๋ '์บ์ ํ ์ ๋ฐ์ดํธ' ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
๊ฒฌ๊ณ ํ ๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ฐ์ดํฐ ์์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ํนํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ๋์์ผ๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํด์ผ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ง๋ ฌํ: ๋ณต์กํ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ์น ์คํ ๋ฆฌ์ง๋ ์ฟ ํค์ ์ ์ฅํ๊ธฐ ์ ์ ํญ์ ๋ฌธ์์ด๋ก ๋ณํํ๊ณ (`JSON.stringify()`), ๊ฒ์ ์ ๋ค์ ํ์ฑ(`JSON.parse()`)ํ์ญ์์ค. ์ด๋ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. IndexedDB๋ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ํญ์ ์คํ ๋ฆฌ์ง ์์ ์ `try-catch` ๋ธ๋ก์ผ๋ก ๊ฐ์ธ๊ฑฐ๋(ํนํ ์น ์คํ ๋ฆฌ์ง์ ๊ฐ์ ๋๊ธฐ์ API์ ๊ฒฝ์ฐ), IndexedDB์ ๊ฐ์ ๋น๋๊ธฐ์ API์ `onerror` ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ญ์์ค. ๋ธ๋ผ์ฐ์ ๋ ์ ์ฅ ์ฉ๋ ์ ํ์ ์ด๊ณผํ๊ฑฐ๋ ์คํ ๋ฆฌ์ง๊ฐ ์ฐจ๋จ๋ ๊ฒฝ์ฐ(์: ์ํฌ๋ฆฟ ๋ชจ๋) ์ค๋ฅ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
- ๋ณด์ ๊ณ ๋ ค ์ฌํญ:
- ๋ฏผ๊ฐํ๊ณ ์ํธํ๋์ง ์์ ์ฌ์ฉ์ ๋ฐ์ดํฐ(๋น๋ฐ๋ฒํธ, ์ ์ฉ์นด๋ ๋ฒํธ ๋ฑ)๋ฅผ ๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง์ ์ง์ ์ ์ฅํ์ง ๋ง์ญ์์ค. ๊ผญ ํ์ํ ๊ฒฝ์ฐ, ์ ์ฅํ๊ธฐ ์ ์ ํด๋ผ์ด์ธํธ ์ธก์์ ์ํธํํ๊ณ ํ์ํ ๋๋ง ๋ณตํธํํ๋, ์ด๋ฌํ ๋ฐ์ดํฐ๋ ๊ฑฐ์ ํญ์ ์๋ฒ ์ธก ์ฒ๋ฆฌ๊ฐ ์ ํธ๋ฉ๋๋ค.
- XSS ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์คํ ๋ฆฌ์ง์์ ๊ฒ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ DOM์ ๋ ๋๋งํ๊ธฐ ์ ์ ์ด๊ท ์ฒ๋ฆฌํ์ญ์์ค.
- ์ธ์ฆ ํ ํฐ์ ํฌํจํ๋ ์ฟ ํค์๋ `HttpOnly` ๋ฐ `Secure` ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ญ์์ค(์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ์์ ์ค์ ๋ฉ๋๋ค).
- ์ ์ฅ ์ฉ๋ ์ ํ ๋ฐ ํ ๋น๋: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ถ๊ณผํ๋ ์ ์ฅ ์ฉ๋ ์ ํ์ ์ ์ํ์ญ์์ค. ์ต์ ๋ธ๋ผ์ฐ์ ๋ ๋๋ํ ํ ๋น๋์ ์ ๊ณตํ์ง๋ง, ๊ณผ๋ํ ์ ์ฅ ๊ณต๊ฐ ์ฌ์ฉ์ ๋ฐ์ดํฐ ์ ๊ฑฐ ๋๋ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ํด๋ผ์ด์ธํธ ์ธก ๋ฐ์ดํฐ์ ํฌ๊ฒ ์์กดํ๋ ๊ฒฝ์ฐ ์คํ ๋ฆฌ์ง ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ์ญ์์ค.
- ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ๋์: ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๊ท์ (์: ์ ๋ฝ์ GDPR, ์บ๋ฆฌํฌ๋์์ CCPA)์ ์ค์ํ์ญ์์ค. ์ฌ์ฉ์์๊ฒ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์ ์ฅํ๋์ง ์ค๋ช ํ๊ณ , ํ์ํ ๊ฒฝ์ฐ ๋ช ์์ ์ธ ๋์๋ฅผ ์ป์ผ์ญ์์ค. ์ฌ์ฉ์๊ฐ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ , ๊ด๋ฆฌํ๊ณ , ์ญ์ ํ ์ ์๋ ๋ช ํํ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ญ์์ค. ์ด๋ ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์๊ฒ ์ค์ํ ์ ๋ขฐ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๋ฒ์ ๊ด๋ฆฌ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ ์ฅ๋ ๋ฐ์ดํฐ์ ๋ํ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค. IndexedDB์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ์ ์ฌ์ฉํฉ๋๋ค. ์น ์คํ ๋ฆฌ์ง์ ๊ฒฝ์ฐ ์ ์ฅ๋ ๊ฐ์ฒด ๋ด์ ๋ฒ์ ๋ฒํธ๋ฅผ ํฌํจํ์ญ์์ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ดํธํ์ง๋ง ์ฌ์ ํ ์ค๋๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์์ ๋ ์ํํ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ํ์์ ๋ฐฉ์งํฉ๋๋ค.
- ์ ์ง์ ์ ํ: ๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ์ ํ๋ ๊ฒฝ์ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ํ๋๋ก ์ค๊ณํ์ญ์์ค. ๋ชจ๋ ๋ธ๋ผ์ฐ์ , ํนํ ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ชจ๋์์๋ ๋ชจ๋ ์คํ ๋ฆฌ์ง API๋ฅผ ์์ ํ ์ง์ํ์ง ์์ ์ ์์ต๋๋ค.
- ์ ๋ฆฌ ๋ฐ ์ ๊ฑฐ: ์ค๋๋๊ฑฐ๋ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฆฌํ๋ ์ ๋ต์ ๊ตฌํํ์ญ์์ค. Cache API์ ๊ฒฝ์ฐ ์บ์ ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ค๋๋ ํญ๋ชฉ์ ์ ๊ฑฐํ์ญ์์ค. IndexedDB์ ๊ฒฝ์ฐ ๋ ์ด์ ๊ด๋ จ ์๋ ๋ ์ฝ๋๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
๊ธ๋ก๋ฒ ๋ฐฐํฌ๋ฅผ ์ํ ๊ณ ๊ธ ์ ๋ต ๋ฐ ๊ณ ๋ ค ์ฌํญ
ํด๋ผ์ด์ธํธ ์ธก ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์ ๋๊ธฐํํ๊ธฐ
๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ ์ธก ๋ฐ์ดํฐ๋ ๋ฐฑ์๋ ์๋ฒ์ ๋๊ธฐํ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ์ฅ์น ๊ฐ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ค์ ์์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์คํ๋ผ์ธ ํ: ์คํ๋ผ์ธ ์ํ์ผ ๋ ์ฌ์ฉ์ ์์ ์ IndexedDB์ ์ ์ฅํฉ๋๋ค. ์จ๋ผ์ธ ์ํ๊ฐ ๋๋ฉด ์ด ์์ ๋ค์ ์ ์ด๋ ์์๋ก ์๋ฒ์ ์ ์กํฉ๋๋ค.
- Background Sync API: ์ฌ์ฉ์๊ฐ ์์ ์ ์ธ ์ฐ๊ฒฐ ์ํ๊ฐ ๋ ๋๊น์ง ๋คํธ์ํฌ ์์ฒญ์ ์ง์ฐ์ํฌ ์ ์๋ ์๋น์ค ์์ปค API๋ก, ๊ฐํ์ ์ธ ๋คํธ์ํฌ ์ ๊ทผ์์๋ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์น ์์ผ / ์๋ฒ ์ ์ก ์ด๋ฒคํธ: ์ค์๊ฐ ๋๊ธฐํ๋ฅผ ์ํด ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
์คํ ๋ฆฌ์ง ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
IndexedDB์ ๋ณต์กํ API๋ฅผ ๋จ์ํํ๊ณ ๋ค๋ฅธ ์คํ ๋ฆฌ์ง ์ ํ์ ๊ฑธ์ณ ํต์ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด LocalForage์ ๊ฐ์ ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ญ์์ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ `localStorage`์ ์ ์ฌํ ๊ฐ๋จํ ํค-๊ฐ API๋ฅผ ์ ๊ณตํ์ง๋ง, ๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ๊ธฐ๋ฅ์ ๋ฐ๋ผ IndexedDB, WebSQL ๋๋ localStorage๋ฅผ ๋ฐฑ์๋๋ก ์ํํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ฐ ๋ ธ๋ ฅ์ ํฌ๊ฒ ์ค์ด๊ณ ๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑ์ ํฅ์์ํต๋๋ค.
ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ(PWA) ๋ฐ ์คํ๋ผ์ธ ์ฐ์ ์ํคํ ์ฒ
์๋น์ค ์์ปค, Cache API, IndexedDB์ ์๋์ง๋ ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ์ ๊ธฐ์ด์ ๋๋ค. PWA๋ ์ด๋ฌํ ๊ธฐ์ ์ ํ์ฉํ์ฌ ์ ๋ขฐํ ์ ์๋ ์คํ๋ผ์ธ ์ ๊ทผ, ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ, ์ค์น ๊ฐ๋ฅ์ฑ ๋ฑ ์ฑ๊ณผ ์ ์ฌํ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ , ํนํ ์ธํฐ๋ท ์ ์์ด ๋ถ์์ ํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ ์ ์ฝ์ ์ ํธํ๋ ์ง์ญ์์๋ PWA๊ฐ ๋งค๋ ฅ์ ์ธ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์์ฑ์ ๋ฏธ๋
๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง์ ์งํ์ ๊ณ์ํด์ ์งํํ๊ณ ์์ต๋๋ค. ํต์ฌ API๋ ์์ ์ ์ผ๋ก ์ ์ง๋์ง๋ง, ์ง์์ ์ธ ๋ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ ๊ฐ์ , ๋ณด์ ๊ธฐ๋ฅ ๊ฐํ, ์คํ ๋ฆฌ์ง ํ ๋น๋์ ๋ํ ๋ ํฐ ์ ์ด์ ์ด์ ์ ๋ง์ถ๊ณ ์์ต๋๋ค. ์๋ก์ด ์ ์๊ณผ ์ฌ์์ ์ข ์ข ๋ณต์กํ ์์ ์ ๋จ์ํํ๊ณ , ์ฑ๋ฅ์ ํฅ์์ํค๋ฉฐ, ์๋ก์ด ๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ ์ ์ฃผ๋ชฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฏธ๋์๋ ๊ฒฝ์๋ ฅ์ ์ ์งํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ต์ฒจ๋จ ๊ฒฝํ์ ๊ณ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๋ธ๋ผ์ฐ์ ์คํ ๋ฆฌ์ง ๊ด๋ฆฌ๋ ํ๋ ์น ๊ฐ๋ฐ์ ์ค์ํ ์ธก๋ฉด์ผ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ๋ถํ๊ณ ๊ฐ์ธํ๋๋ฉฐ ๊ฒฌ๊ณ ํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๋๋ก ํฉ๋๋ค. ์ฌ์ฉ์ ์ ํธ๋๋ฅผ ์ํ ์น ์คํ ๋ฆฌ์ง์ ๋จ์ํจ๋ถํฐ ์คํ๋ผ์ธ ์ฐ์ PWA๋ฅผ ์ํ IndexedDB์ Cache API์ ๊ฐ๋ ฅํจ์ ์ด๋ฅด๊ธฐ๊น์ง, ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค์ํ ๋๊ตฌ ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ฐ์ดํฐ ํฌ๊ธฐ, ์์์ฑ ์๊ตฌ, ์ฑ๋ฅ, ๋ณด์๊ณผ ๊ฐ์ ์์๋ฅผ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ ์์์ฑ ์ ๋ต์ ์ ๋ต์ ์ผ๋ก ์ ํํ๊ณ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ์ต์ ํํ ๋ฟ๋ง ์๋๋ผ ๊ธ๋ก๋ฒ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ํ์ค์ ์ค์ํ์ฌ ๊ถ๊ทน์ ์ผ๋ก ๋ ํ๋ ฅ์ ์ด๊ณ ์ธ๊ณ์ ์ผ๋ก ๊ฒฝ์๋ ฅ ์๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ด์ด์ง๋๋ค. ๋ชจ๋ ๊ณณ์ ์ฌ์ฉ์๋ฅผ ์ง์ ์ผ๋ก ๊ฐํํ๋ ์ฐจ์ธ๋ ์น ๊ฒฝํ์ ๊ตฌ์ถํ๊ธฐ ์ํด ์ด๋ฌํ ์ ๋ต์ ์ฑํํ์ญ์์ค.